package copyengine.ui.component.scrollable.scrollPanel
{
    import copyengine.ui.component.scrollable.element.ICEScrollableElement;

    import flash.geom.Rectangle;

    import starling.display.DisplayObjectContainer;

    /**
     *  该类只处理所有Element的刷新
     *  --->判断每个Element是否和Viewport发生碰撞 如有没有则不显示 否则显示
     *
     *  对于视口viewportRe的移动 交个TouchProxy处理
     *  对于Element的 添加/删除 交给 ScrollPanel主类助理
     *  对于Element的排序交个Layout处理
     *
     */
    public class CEScrollPanelCore
    {
        public var mScrollPanelContainer:DisplayObjectContainer;
        public var viewportRe:Rectangle;
        public var allSubElementVector:Vector.<ICEScrollableElement>;

        private var mAllShowElementVector:Vector.<ICEScrollableElement>;
        private var mAllHideElementVector:Vector.<ICEScrollableElement>;

        /**
         * 用于刷新时候的临时交换,
         */
        private var mTempAllShowElementVector:Vector.<ICEScrollableElement>;
        private var mTempAllHideElementVector:Vector.<ICEScrollableElement>;

        public function CEScrollPanelCore()
        {
            super();
        }

        //==============================//
        //==Public Interface  Function
        //==============================//

        /**
         * 刷新当前界面的显示, _isElementChangeOrInit 标识当前Element是否发生了变化
         *
         * 发生变化指的是
         *
         * 1`  Element的宽高发生变化
         * 2`  Element数量发生变化
         * 3` Element的SortRank发生变化
         *
         * 内部刷新逻辑 使用两个Vector去维护所有Element 一个当前显示中的 一个是被Hide的
         * 每次刷新 首先刷新当前再显示的元素 如果能隐藏的就隐藏 然后再刷新Hide掉的如果可以显示就显示
         * 这样做的目的是为了实现List的共享显示对象,当前显示的Element Hide时候会归还显示对象到池子
         * 隐藏的元素 显示的时候从池子中把对象再取回来
         *
         * 但是 当Element发生变化时候 两个Vector就有可能记录Element逻辑发生错误(没添加新的Element或者没删除旧的Element)
         * 此时就是强制清空两个Vector 强制全部刷新一次
         *
         */
        public function refresh(_isElementChangeOrInit:Boolean):void
        {
            if (_isElementChangeOrInit) {
                mAllHideElementVector.length = mTempAllHideElementVector.length = 0;
                mAllShowElementVector.length = mTempAllShowElementVector.length = 0;
                doRefreshEachVector(allSubElementVector);
            } else {
                doRefreshEachVector(mAllShowElementVector);
                doRefreshEachVector(mAllHideElementVector);
            }
            swapShowVector();
            swapHideVector();
        }

        //========================//
        //==Private  Function
        //=========================//

        private function doRefreshEachVector(_elementVector:Vector.<ICEScrollableElement>):void
        {
            for each(var element:ICEScrollableElement in _elementVector) {
                if (element.getBounds().containsRect(viewportRe)) {
                    element.show(mScrollPanelContainer, viewportRe);
                    mTempAllShowElementVector.push(element);
                } else {
                    element.hide();
                    mTempAllHideElementVector.push(element);
                }
            }
        }

        private function swapShowVector():void
        {
            var temp:* = mAllShowElementVector;
            mAllShowElementVector = mTempAllShowElementVector;
            mTempAllShowElementVector = temp;
            mTempAllShowElementVector.length = 0;
        }

        private function swapHideVector():void
        {
            var temp:* = mAllHideElementVector;
            mAllHideElementVector = mTempAllHideElementVector;
            mTempAllHideElementVector = temp;
            mTempAllHideElementVector.length = 0;
        }

    }


}
